/*
题目：根据身高重建队列
假设有打乱顺序的一群人站成一个队列，数组 people 表示队列中一些人的属性（不一定按顺序）。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ，前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ，其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性（queue[0] 是排在队列前面的人）。

https://leetcode.cn/problems/queue-reconstruction-by-height/description/
 */
public class ReconstructQueue {
    public int[][] reconstructQueue(int[][] people) {
        // 核心思路：高的人可以随便站
        // 按照身高降序，并且按照 K 升序，要求的 k 少则放在前面
        Arrays.sort(people, (x, y) -> {
            if (x[0] != y[0]) {
                return y[0] - x[0];
            }
            return x[1] - y[1];
        });

        LinkedList<int[]> queue = new LinkedList<> ();
        for (int[] person : people) {
            // 前面放的都是 高的
            // 对于第 i 个人来说，前面放的人都比它高
            // 而剩余的没排的人对于 第 i 个人都没有影响
            // 所以对于 第 i 个人 来说，它只需要在当前局势下，放好自己应该在的位置
            queue.add(person[1], person);
        }

        return queue.toArray(people);
    }
}
